package com.itheima.Jiuye17.ExceptionTest;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取类加载器对象
        ClassLoader classLoader = Test.class.getClassLoader();
        //利用类加载器获取到指定路径下的资源文件
        InputStream methers = classLoader.getResourceAsStream("qaq.properties");
        //将指定路径下的资源文件加载到数组中
        Properties p = new Properties();
        p.load(methers);
        System.out.println(p);
        //关流
        methers.close();
        //根据键获取值，即获得到qaq.properties文件中className对应的地址
        String classname = p.getProperty("className");
        //获取到对应类的字节码文件对象
        Class<?> aClass = Class.forName(classname);
        //利用字节码对象获取到对应类的构造器
        Constructor<?> constructor = aClass.getDeclaredConstructor();
        //使用放射创建对象
        UesrTest usertest = (UesrTest) constructor.newInstance();
        //获取到类中所以的方法
        Method[] methods = aClass.getDeclaredMethods();
        //创建一个字符输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\IEDA_Demo\\basic\\mJiuYe\\src\\a.txt",true));
        //遍历数组获得到每一个方法对象
        //meyhod依次代表每一个方法对象
        int a = 0;
        for (Method method : methods) {
            try {
                //判断方法是否有MyTest这个注解
                if (method.isAnnotationPresent(MyTest.class)) {
                    method.invoke(usertest);
                }
            } catch (Exception e) {
               //将发生异常的方法名写到文件中
               bw.write(method.getName()+"方法发生了错误");
               bw.newLine();
               //记录当前时间当前时间
                Date date = new Date();
                //创建一个格式化对象
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss:SS");
                //格式化
                String format = sdf.format(date);
                //将时间写到文件中
                bw.write(format);
                bw.newLine();
                //获取异常名称
                String simpleName = e.getCause().getClass().getSimpleName();
               bw.write("异常名称："+simpleName);
               bw.newLine();
               //获取异常原因
                String message = e.getCause().getMessage();
                System.out.println(message);
                bw.write("异常原因："+message);
                bw.newLine();
                bw.flush();
                a++;
            }
        }
        bw.write(a);
        bw.flush();
        bw.newLine();
        bw.close();
    }
}